package main

import (
    "fmt"
	"log"
	"net"
	"strconv"
	"strings"
)

const (
	//绑定IP地址
	ip = "127.0.0.1"
	//绑定端口号
	port       = 3333
	LOGIN      = 1 //登陆
	GETFRIENDS = 2 //获取好友列表
	CHATMSG    = 3 //聊天信息
)
const (
	ConnectionMax = 100 //CS max connect
)

var (
	k = 0
)

type ClientInfo struct {
	clientId string //标识
	conn     net.Conn
	//VerifyKey  string //连接验证KEY
	//ConnVerify bool   //是否验证
	Address string //服务器地址
	Port    string //服务端口
}

//数据包 服务器接收请求数据包
type SerRecPacket struct {
	ptype      string //类型 3位
	username   string //发起方
	tousername string //接收方
	data       string //信息
}

//数据包 服务器返回数据包
type SerRtnPacket struct {
	status  string //状态
	message string //信息
}

//数据包 服务器转发数据包
type SerForwardPacket struct {
	username string //发起方
	data     string //信息
}

//数据包 服务器转发数据包
type ForwardRtnPacket struct {
	status  string //状态
	message string //信息
}

func main() {
	listener, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""})
	if err != nil {
		fmt.Println("监听端口失败:", err.Error())
		return
	}
	for {
		conn, listenErr := listener.Accept()
		if listenErr != nil {
			log.Printf("failed listening:%v\n", listenErr)
		}
		cconn := NewConnection_CS(conn)
		go ClinetHandle(cconn)
	}

	fmt.Println("链接结束")
}

func NewClientConnection(conn net.Conn) *ClientInfo {
	k++
	strs := strings.Split(conn.RemoteAddr().String(), ":")
	ci := &ClientInfo{strconv.Itoa(k), conn, strs[0], strs[1]}
	return ci
}
func ClinetHandle(ci *ClientInfo) {
	conn := ci.conn
	defer conn.Close()
	data := make([]byte, 128)
	for {
		i, err := conn.Read(data)
		fmt.Printf("客户端信息%v\n", ci)
		fmt.Printf("%s客户端发来数据:%s\n", ci.clientId, string(data[0:i]))
		if err != nil {
			fmt.Println("读取客户端数据错误:", err.Error())
			break
		}
		conn.Write([]byte{'o', 'k'})
	}
}
